package org.ehe.erp.service.quality;

import com.baomidou.mybatisplus.extension.service.IService;
import org.ehe.common.mybatis.core.page.PageQuery;
import org.ehe.common.mybatis.core.page.TableDataInfo;
import org.ehe.erp.domain.quality.ErpQualityFeedback;
import org.ehe.erp.domain.quality.bo.ErpQualityFeedbackBo;
import org.ehe.erp.domain.quality.dto.QualityFeedbackQueryDto;
import org.ehe.erp.domain.quality.vo.ErpQualityFeedbackVo;

import java.util.Collection;
import java.util.List;

/**
 * 质检异常反馈 Service
 *
 * 核心业务：
 * 1. 质检不合格时发起异常反馈单；
 * 2. 支持状态流转（待处理→处理中→已处理→已关闭）；
 * 3. 自动生成单号、校验唯一、回填处理人/时间；
 * 4. 提供分页/列表/详情/删除/状态处理等完整生命周期管理。
 *
 * @author zhangnn
 * @date 2025-09-10
 */
public interface ErpQualityFeedbackService extends IService<ErpQualityFeedback> {


    /**
     * 分页查询异常反馈列表
     *
     * @param dto        查询条件
     * @param pageQuery  分页参数
     * @return 分页结果（含 VO）
     */
    TableDataInfo<ErpQualityFeedbackVo> queryPageList(QualityFeedbackQueryDto dto, PageQuery pageQuery);

    /**
     * 不分页查询异常反馈列表
     *
     * @param dto 查询条件
     * @return 列表结果（含 VO）
     */
    List<ErpQualityFeedbackVo> queryList(QualityFeedbackQueryDto dto);

    /**
     * 根据主键获取异常反馈详情
     *
     * @param id 主键
     * @return VO 对象
     */
    ErpQualityFeedbackVo queryById(Long id);


    /**
     * 新增异常反馈单
     * <p>
     * 自动生成单号（QFyyyyMMdd###），默认状态=待处理，默认严重程度=一般。
     *
     * @param bo 业务对象
     * @return true 成功
     */
    Boolean insertByBo(ErpQualityFeedbackBo bo);


    /**
     * 修改异常反馈单
     * <p>
     * 允许修改基础字段，但不允许逆向回退状态；单号若提供则校验唯一。
     *
     * @param bo 业务对象
     * @return true 成功
     */
    Boolean updateByBo(ErpQualityFeedbackBo bo);


    /**
     * 批量删除异常反馈
     * <p>
     * 已关闭（status=3）的单据不允许删除。
     *
     * @param ids     主键集合
     * @param isValid 是否做业务校验
     * @return true 成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);


    /**
     * 处理/关闭异常反馈
     * <p>
     * 只允许顺序流转：待处理(0)→处理中(1)→已处理(2)→已关闭(3)；
     * 进入“已处理/已关闭”时必须填写处理结果，并自动回填当前登录人/时间。
     *
     * @param id           主键
     * @param targetStatus 目标状态
     * @param handleResult 处理结果（必填）
     * @return true 成功
     */
    ErpQualityFeedback handleFeedback(Long id, Integer targetStatus, String handleResult);


    /**
     * 校验反馈单号唯一性
     *
     * @param feedbackNo 单号
     * @param id         排除的主键（null 表示新增）
     * @return true 唯一
     */
    Boolean checkFeedbackNoUnique(String feedbackNo, Long id);

    String generateFeedbackNo();

    /**
     * 提交质检记录
     * @param id
     * @return
     */
    ErpQualityFeedback submit(Long id,Long handlerId);


}
